package Demo3;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class ThreadDemo4 {

    public static void main(String[] args) throws ExecutionException, InterruptedException {

        // 创建callable
        Callable<Integer> callable = new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                int sum = 0;
                for (int i = 1;i <= 1000;i++) {
                    sum += i;
                }
                return sum;
            }
        };

        // thread不能直接将callable作为参数,需要再包装一层

        // 对callable进行包装  futureTask 就是给callable一个号
        // 吃饭的时候给你个号 号就能让你在未来某个时刻,拿到你的饭
        FutureTask<Integer> futureTask = new FutureTask<>(callable);
        // 将callable作为参数传给thread
        Thread t = new Thread(futureTask);
        t.start();
        // call方法是在t线程 但是get方法是在主线程,此时如果call方法
        // 没搞完就执行get,此时得到的结果就不会是我们想要的
        // 但是get方法和join方法类似,它会等call方法执行完再再执行,如果call没执行完
        // 执行get就会阻塞
        // get方法就是获取get方法的返回值结果 凭小票取饭
        System.out.println(futureTask.get());
        main1(null);
    }

    public static void main1(String[] args) throws ExecutionException, InterruptedException {
        // 点饭
        Callable<String> c = new Callable<String>() {
            @Override
            public String call() throws Exception {
                return "haha";
            }
        };
        // 拿小票
        FutureTask<String> futureTask = new FutureTask<>(c);
        // 餐厅搞饭
        Thread t = new Thread(futureTask);
        t.start();
        // 凭小票拿饭
        System.out.println(futureTask.get());
    }

}
